import { Str2CharArray } from "@/tool/stringUtils"

class BiliWEBSocketClient extends WebSocket {

  client : WebSocket | undefined
  timer : NodeJS.Timer | undefined

  constructor(url: string){
    super(url)
  }

  //发送数据
  sendMsg = (operation: BiliWSSOperationCode, data?: any) => {
    let msgbody = !data ? new Array() : Str2CharArray(data)
    // 编码后的内容长度加上固定16的包头，推算出数据包总长度
    let msgLength = 16 + msgbody.length;
    // 包头部分
    let msgPack: any = new Array();
    
    msgPack.push.apply(msgPack, [
        // Packet Length：整个Packet的长度，包含Header
        msgLength % (Math.pow(2, 64) - 1) / (Math.pow(2, 32) - 1), 
        msgLength % (Math.pow(2, 32) - 1) / (Math.pow(2, 16) - 1), 
        msgLength % (Math.pow(2, 16) - 1) / (Math.pow(2, 8) - 1), 
        msgLength % (Math.pow(2, 8) - 1),
        // Header Length：Header的长度，固定为16。
        0, 16,
        // 如果Version=0，Body中就是实际发送的数据。
        0, 0,
        // Operation：消息的类型
        0, 0, 0, operation,
        // Sequence ID：保留字段，可以忽略。
        0, 0, 0, 0
    ]);

    msgPack.push.apply(msgPack, msgbody);

    msgPack = new Uint8Array(msgPack);

    this.send(msgPack);
  }
}


enum BiliWSSOperationCode{
  //  客户端发送的心跳包(30秒发送一次)
  OP_HEARTBEAT = 2,
  //  服务器收到心跳包的回复
  OP_HEARTBEAT_REPLY = 3,
  //	服务器推送的弹幕消息包
  OP_SEND_SMS_REPLY = 5,
  //  客户端发送的鉴权包(客户端发送的第一个包)
  OP_AUTH = 7,
  //  服务器收到鉴权包后的回复
  OP_AUTH_REPLY = 8,
}

export { BiliWEBSocketClient, BiliWSSOperationCode }